package com.hspedu.InnerClass;

/**
 * @Author Stringzhua
 * @Date 2024/3/6 17:55
 * description:
 */
public class StaticInnerClass {
    public static void main(String[] args) {
        Outer10 outer10 = new Outer10();
        outer10.show();

        //外部其他类 使用静态内部类
        //方式一:
        //因为静态内部类可以通过类名直接访问【前提是满足访问权限】
        Outer10.Inner10 inner10 = new Outer10.Inner10();
        inner10.say();
        //方式二:
        //编写一个方法可以返回静态内部类对象的实例
        Outer10.Inner10 inner101 = outer10.getInner10();
        System.out.println("===============");
        inner101.say();

        Outer10.Inner10 inner10_ = Outer10.getInner10_();
        System.out.println("===============");
        inner10_.say();
    }
}

class Outer10 {//外部类
    private int n1 = 10;
    private static String name = "张三";

    private static void cry() {
    }

    //Inner10就是静态内部类
    //1.放在外部类的成员位置
    //2.使用static修饰
    //3.可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
    //4.可以添加任意的访问修饰符(public protected 默认 public),因为它的地位就是一个成员
    //5.作用域:通其他成员,为整个类体
    static class Inner10 {
        private static String name="爪爪吃蒸饺";

        void say() {
//            System.out.println(n1);//Non-static field 'n1' cannot be referenced from a static context
            //如果外部类和静态内部类的成员重名时,也遵循就近原则, 静态内部类访问时,如果想访问外部类的成员,则可以使用 外部类名.成员 去访问
            System.out.println(name+" 外部类name="+Outer10.name);
            cry();
        }
    }

    public void show() {//外部类访问静态内部类方式,先创建对象,再访问
        new Inner10().say();
    }

    public Inner10 getInner10() {
        return new Inner10();
    }

    public static Inner10 getInner10_() {
        return new Inner10();
    }
}
